/*
题目: 最长优雅子数组
给你一个由 正 整数组成的数组 nums 。

如果 nums 的子数组中位于 不同 位置的每对元素按位 与（AND）运算的结果等于 0 ，则称该子数组为 优雅 子数组。

返回 最长 的优雅子数组的长度。

注意：长度为 1 的子数组始终视作优雅子数组。
https://leetcode.cn/contest/weekly-contest-309/problems/longest-nice-subarray/
 */
public class LongestNiceSubarray {
    public int longestNiceSubarray(int[] nums) {
        int n = nums.length;
        // 以 i 元素结尾的最长优雅子数组的长度
        int[] dp = new int[n];
        Arrays.fill(dp, 1);

        int src = 1;
        for (int i = 1; i < n; i++) {
            int pos = i - dp[i - 1] - 1;
            for (int j = i - dp[i - 1]; j < i; j++) {
                if ((nums[i] & nums[j]) != 0) {
                    pos = j;
                }
            }

            dp[i] = i - pos;
            src = Math.max(src, dp[i]);
        }

        return src;
    }
}
